<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Leon</title>
</head>

<body>

</body>

</html>
<script>
  // 按照顺序向数组内插入一个数据

  // 已知排序完整的数组
  var arr = [10, 20, 30, 40, 50];

  // 准备要插入的数字
  var num = 22;

  // 结果: 把 n 按照现有顺序插入到数组内

  function insertArr(n) {
    // 当插入的数字介于数组中两个元素的中间时，插入的位置是与之比较的后一个元素
    // 注意：前一个被比较元素的下标最大为arr.length - 2
    for (let i = 0; i < arr.length - 1; i++) {
      if (n >= arr[i] && n <= arr[i + 1]) {
        arr.splice(i + 1, 0, n);
        break;
      }
    }
    // 当插入的数字比第一个元素还小时，放在最前面
    if (n < arr[0]) {
      arr.unshift(n);
    }
    // 当插入的元素比最后一个元素还大时，放在最后面
    if (n > arr[arr.length - 1]) {
      arr.push(n);
    }
  }

  insertArr(num);
  document.write(arr);

  // function insert(n) {
  //   var i = arr.findIndex(value => value > n);
  //   arr.splice(i === -1 ? arr.length : i, 0, n);
  // }

  // insert(num)

  // 方案1：
  // arr.push(n);
  // arr.sort(function(a,b){return a-b});
  // console.log(arr);

  // 方案2：
  /* 
    要插入的是数字有几种情况
      1. 比 [0] 小
      2. 比 [length-1] 大
      3. 在中间
      4. 和某一个数一样
  */
  // 语法：数组.indexOf(数据) 
  // 返回值为：如果数据在数组中存在，则返回对应的索引
  //           如果数据在数组中不存在，则返回-1
  if (n <= arr[0]) { // 比最小还小
    arr.unshift(n);
  } else if (n >= arr[arr.length - 1]) { // 比最大的还大
    arr.push(n)
  } else if (arr.indexOf(n) !== -1) { // 有一个一模一样
    arr.splice(arr.indexOf(n), 0, n);
  } else { // 其他情况需要比较 插入
    // 需要循环比较
    for (var i = 1; i < arr.length; i++) {
      // 只要n比数组当前这一位数小，则插入到这个数的前面
      if (n < arr[i]) {
        arr.splice(i, 0, n);
        break; // 插入后要 break
      }
    }
  }
  console.log(arr);

  // 优化
  if (n >= arr[arr.length - 1]) { // 比最大的还大
    arr.push(n)
  } else {
    for (var i = 0; i < arr.length; i++) {
      if (n <= arr[i]) {
        arr.splice(i, 0, n);
        break; // 插入后要 break
      }
    }
  }
</script>